#include "ManejadorDistrito.h"

using namespace Manejadores;

ManejadorDistrito::ManejadorDistrito() {
	Configuracion* config = config->getInstancia();
	string pathDelArchivo = config->getNombreArchivoDistrito();
	unsigned int tamanio = 50;
	this->distritos = new ArchivoDeEstructurasFijas(pathDelArchivo, tamanio);
	this->indicePorUnicidad = new HashExtensible("IndicePorUnicidadDistrito");
}

bool ManejadorDistrito::alta(Distrito* distrito) {

	string clavePorUnicidad = distrito->getNombre();
	if (!indicePorUnicidad->existe(clavePorUnicidad)) {
		unsigned int posicionDelRegistro = distritos->insertar(distrito);
		indicePorUnicidad->insertar(clavePorUnicidad, posicionDelRegistro);
		indicePorUnicidad->exportarTxt("nachito");
		return true;
	} else
		return false;
}

bool ManejadorDistrito::baja(Distrito* distrito) {
	string clavePorUnidicidad = distrito->getNombre();
	IRegistroIndice* aBorrar = indicePorUnicidad->buscar(clavePorUnidicidad);
	if (aBorrar->getOffsets()->size() > 0) {
		distritos->borrar(distrito, aBorrar->getOffsets()->at(0));
		indicePorUnicidad->eliminar(clavePorUnidicidad,aBorrar->getOffsets()->at(0));
		return true;
	} else
		return false;
}

bool ManejadorDistrito::modificacion(Distrito* distrito) {

	string clavePorUnidicidad = distrito->getNombre();
	IRegistroIndice* viejaPosicion = indicePorUnicidad->buscar(clavePorUnidicidad);
	unsigned int nuevaPosicion = distritos->modificar(distrito, viejaPosicion->getOffsets()->at(0));
	if (viejaPosicion->getOffsets()->at(0) != nuevaPosicion){
		indicePorUnicidad->modificar(clavePorUnidicidad,viejaPosicion->getOffsets()->at(0),nuevaPosicion);
		return true;
	}
	else
		return false;
}

bool ManejadorDistrito::existe (string nombreDistrito){
	for (unsigned int i = nombreDistrito.size(); i < 50; i++) {
		nombreDistrito += ' ';
	}
	return this->indicePorUnicidad->existe(nombreDistrito);
}

ManejadorDistrito::~ManejadorDistrito() {
	delete distritos;
	delete indicePorUnicidad;
}
